/*
 * Anillo.h
 *
 *  Created on: 25/07/2014
 *      Author: nicolas
 */

#ifndef ANILLO_H_
#define ANILLO_H_

#include <sys/socket.h>
#include "../defines.h"
#include "../comun/TimeoutBroker.h"
#include <netinet/in.h>
#include <arpa/inet.h>
#include "../ipc/Socket.h"
#include "../ipc/ColaMensajes.h"
#include "../comun/ServidorRemoto.h"

class Anillo {
private:
	int sockMulti;
	int sockUNI;
	int puertoMulti;
	int puertoUNI;
	int puertoTCP;
	char ipMulticast[16];
	void configSockets();
	int idBroker;
	int idBrokerSiguiente;
	int numeroBrokerLocal;
	TimeoutBroker shmem;
	unsigned int timeOutID;
	bool esperarMensaje(int sock, int tiempo);
	void lanzarInvitacion();
	void lanzarTimeOut(int tiempo);
	void enviarRespuesta(const char* msg);
	bool obtenerConfirmacion();
	void conectarTCP(const char* ip);
	void handshakeTCP(Socket& socket, int id, const char* ip, int puerto,
			bool brokerEsReceptor);
	void copiarIP(struct sockaddr& addr, char* ip);
	void lanzarConeccionSimpleTCP(int socketFd);
	int time;
	struct sockaddr_in addrFrom;
	Socket siguienteEnvio;
	Socket siguienteRecepcion;
	Socket anterior;
	bool tieneSiguienteEnvio;
	bool tieneSiguienteRecepcion;
	bool tieneAnterior;
	ColaMensajes* cola;
	ColaMensajes* colaRespuesta;
	ServidorRemoto rpc;
	unsigned int generacion;

	bool esLider;
	bool esUnico;

	bool tokenPropioMasReciente(unsigned int version, unsigned int generacion,
			MENSAJE_BROKER& msg);

public:
	Anillo(int puerto, int puertoUni, int puertoTCP, char* ipMulticast,
			int time, int numeroBrokerLocal, int idBroker, ColaMensajes* cola,
			ColaMensajes* colaRespuesta);
	virtual ~Anillo();
	void lanzarTimeOutToken(int tiempo);
	void generarToken();
	void generar(int generacion);
	void interconectar();
	bool recuperarToken(unsigned int version, unsigned int generacion);
	void enviarASiguiente(MENSAJE_BROKER& msg);
	void enviarASiguiente(MENSAJE_TOKEN& msg);
};

#endif /* ANILLO_H_ */
